package com.fei;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
/**
 * description:
 * author:zcx
 * lenovo
 * 时间：2022.01.18.16.40
 */
public class ProxyCglib implements MethodInterceptor {
    // 定义一个目标对象
    private final Object consignor;

    // 通过带参构造器传递目标对象
    public ProxyCglib(Object consignor) {
        this.consignor = consignor;
    }

    /**
     * 拦截器的作用
     * 1.调用目标对象的方法
     * 2.增强行为
     *
     * @param o           -动态生成代理类的实例
     * @param method      -
     * @param objects     -参数列表
     * @param methodProxy -生成的代理类对方法的代理引用
     * @return -返回一个对象
     * @throws Throwable -从代理实例上的方法调用抛出的异常。
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object result = methodProxy.invokeSuper(consignor, objects);
        sendMsg();
        deal();
        return result;
    }

    // 获取代理对象
    public Object getProxy() {
        // 调用Enhancer 对象中的create() 方法可以生成代理类，进而得到代理对象
        var enhancer=new Enhancer();
        // 将目标类作为其父类
        enhancer.setSuperclass(consignor.getClass());
        // 定义拦截器，回调对象为自身对象
        enhancer.setCallback(this);
        // 生成一个代理对象，并返回
        return enhancer.create();
    }

    // 房屋中介发布房源
    public void sendMsg() {
        System.out.println("房屋中介发布房源");
    }

    // 办理手续
    public void deal() {
        System.out.println("代替房东帮客户办理手续");
    }
}
